概述h2数据库
h2database
为我们提供了十分轻量,十分快捷方便的内嵌式数据库
- H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
- 可以同应用程序打包在一起发布
- 它的另一个用途是用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态
- 提供JDBC访问接口,提供基于浏览器的控制台,可以执行sql
- 免费,开源,够快
还方便了程序刚开始dao层单元测试测试,不需要搭建oracle
,不需要加载mysql
,快速测试写的dao
SpringBoot整合测试
pom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--h2数据库--> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <!--h2数据库--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
|
yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| spring: datasource: #配置h2数据库的连接地址 # Embedded 嵌入式 # Remote (client/server) 远程连接 # In-Memory 内存 url: jdbc:h2:mem:test #配置JDBC Driver driver-class-name: org.h2.Driver #配置数据库用户名 username: root #配置数据库密码 password: 123456 #进行该配置,程序开启时就会启动h2 web consloe。当然这是默认的,如果你不想在启动程序时启动h2 web consloe,那么就设置为false。 h2: console: enabled: true #进行该配置,你就可以通过YOUR_URL/h2访问h2 web consloe。YOUR_URL是你程序的访问URl。默认为/h2-console path: /h2 # 进行该配置后,h2 web consloe就可以在远程访问了。否则只能在本机访问。 settings: web-allow-others: true jpa: properties: hibernate: hbm2ddl: auto: update dialect: org.hibernate.dialect.MySQL5InnoDBDialect #启用SQL语句的日志记录 show-sql: true
|
数据库支持多种连接模式和连接设置,主要有 Embedded 嵌入式
,Remote (client/server) 远程连接
,In-Memory 内存
Embedded 嵌入式
URL jdbc:h2:〜/test
表示数据库存储在用户主目录中以“ test”
开头的文件中。 支持绝对位置,如jdbc:h2:/data/db/test
。 在嵌入式模式下,数据库与应用程序以相同的过程运行。 任何时候都只能有一个进程访问数据库。 如果您拥有权限,则不存在的数据库将自动创建。 形式为jdbc:h2:./data/test
的URL相对于当前工作目录(启动应用程序的目录)。 建议使用相对于〜
或绝对位置的位置。
Remote (client/server) 远程连接
URL jdbc:h2:tcp//localhost/〜/test
表示通过TCP / IP
连接到此计算机上运行的H2 TCP
服务器,并在用户主目录中打开一个名为test
的数据库。 必须首先启动服务器。 任意数量的客户端都可以连接到同一数据库。 适用与嵌入式数据库相同的位置规则。
In-Memory 内存
URLjdbc:h2:mem:test
意味着打开一个名为“test”
的内存数据库。数据不持久,当最后一个数据库连接关闭时,数据会丢失。多个线程可以访问同一个数据库,但是数据只能在同一个进程中可见。
logback-spring.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| <?xml version="1.0" encoding="UTF-8"?>
<configuration> <!--定义日志文件的存储地址,使用绝对路径--> <property name="LOG_HOME" value="d:/logs"/>
<!-- Console 输出设置 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> <charset>utf8</charset> </encoder> </appender>
<!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <fileNamePattern>${LOG_HOME}/xc.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
<!-- 异步输出 --> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="FILE"/> </appender>
<logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="INFO" additivity="false"> <appender-ref ref="CONSOLE"/> </logger> <logger name="org.springframework.boot" level="INFO"/> <root level="info"> <!--<appender-ref ref="ASYNC"/>--> <appender-ref ref="FILE"/> <appender-ref ref="CONSOLE"/> </root> </configuration>
|
Application
1 2 3 4 5 6 7 8 9 10 11 12 13
| package cn.zysheep.springboot;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class Springboot06DataH2Application {
public static void main(String[] args) { SpringApplication.run(Springboot06DataH2Application.class, args); }
}
|
entity
使用Jpa
相关注解,在h2DB
中自动生成与实体对应的表
1 2 3 4 5 6 7 8 9 10 11 12
| @Data @NoArgsConstructor @AllArgsConstructor @Entity public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String name;
}
|
启动Springboot项目,浏览器访问http://localhost:8080/h2
后台主页
对h2
数据库的CRUD操作和使用JPA对MySQL数据库的操作一致
数据库支持多种连接模式和连接设置,不同的连接模式和连接设置是通过不同的URL来区分的,URL中的设置是不区分大小写。
Topic |
URL Format and Examples |
嵌入式(本地)连接 |
jdbc:h2:[file:][] jdbc:h2:~/test jdbc:h2:file:/data/sample jdbc:h2:file:C:/data/sample (Windows only) |
内存数据库(私有) |
jdbc:h2:mem: |
内存数据库(被命名) |
jdbc:h2:mem: jdbc:h2:mem:test_mem |
使用TCP/IP的服务器模式(远程连接) |
jdbc:h2:tcp://[:]/[] jdbc:h2:tcp://localhost//test jdbc:h2:tcp://dbserv:8084//sample |
使用SSL/TLS的服务器模式(远程连接) |
jdbc:h2:ssl://[:]/ jdbc:h2:ssl://secureserv:8085/~/sample; |
使用加密文件 |
jdbc:h2:;CIPHER=[AES|XTEA] jdbc:h2:ssl://secureserv//testdb;CIPHER=AES jdbc:h2:file:/secure;CIPHER=XTEA |
文件锁 |
jdbc:h2:;FILE_LOCK={NO|FILE|SOCKET} jdbc:h2:file:/quickAndDirty;FILE_LOCK=NO jdbc:h2:file:/private;CIPHER=XTEA;FILE_LOCK=SOCKET |
仅打开存在的数据库 |
jdbc:h2:;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE |
当虚拟机退出时并不关闭数据库 |
jdbc:h2:;DB_CLOSE_ON_EXIT=FALSE |
用户名和密码 |
jdbc:h2:[;USER=][;PASSWORD=] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123 |
更新记入索引 |
jdbc:h2:;LOG=2 jdbc:h2:file:~/sample;LOG=2 |
调试跟踪项设置 |
jdbc:h2:;TRACE_LEVEL_FILE=<level 0..3> jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3 |
忽略位置参数设置 |
jdbc:h2:;IGNORE_UNKNOWN_SETTINGS=TRUE |
指定文件读写模式 |
jdbc:h2:;ACCESS_MODE_LOG=rws;ACCESS_MODE_DATA=rws |
在Zip文件中的数据库 |
jdbc:h2:zip:!/ jdbc:h2:zip:~/db.zip!/test |
兼容模式 |
jdbc:h2:;MODE= jdbc:h2:~/test;MODE=MYSQL |
自动重连接 |
jdbc:h2:;AUTO_RECONNECT=TRUE jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE |
自动混合模式 |
jdbc:h2:;AUTO_SERVER=TRUE jdbc:h2:~/test;AUTO_SERVER=TRUE |
更改其他设置 |
jdbc:h2:;=[;=…] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3 |